import random

from django import http
from django.shortcuts import render
from django.views import View

from celery_tasks.tasks.sms import send_sms
from libs.captcha.captcha import captcha
from django_redis import get_redis_connection

from libs.yuntongxun.sms import CCP
from utils.response_code import RET
from verifications import constants


class ImageCodeView(View):
    def get(self, request, image_code_id):

        # 1. 获取image_code_id
        pass
        # 2. 生成一个图片
        text, image_data = captcha.generate_captcha()
        # 3. 保存这个图片的文本信息到 redis中
        redis_conn = get_redis_connection('code')
        redis_conn.setex('image_code_%s'%image_code_id, constants.REDIS_IMAGE_CODE_EXPIRES, text)
        # 4. 返回图片
        return http.HttpResponse(image_data, content_type='image/jpeg')
    pass


class SmsCodeView(View):
    def get(self,request,mobile):
        # 1. 接收参数
        image_code = request.GET.get('image_code').upper()
        image_code_id = request.GET.get('image_code_id')
        # 2. 校验参数
        if not all([image_code_id,image_code]):
            return http.JsonResponse({'code':RET.PARAMERR, 'errmsg':'参数不全'})
        # 3. 判断图形验证码
        # 3.1 取出图形验证码的内容
        redis_conn = get_redis_connection('code')

        code = redis_conn.get('image_code_%s'%image_code_id).decode()
        # 3.2 判断是否相等
        if code != image_code:
            return http.JsonResponse({'code':RET.IMAGECODEERR, 'errmsg':'图形验证码错误'})
        # 4. 删除图形验证码
        redis_conn.delete('image_code_%s'%image_code_id)
        # 5. 生成短信验证码
        sms_code = "%06d"%random.randint(0,999999)
        # 7. 短信验证码保存redis
        redis_conn = get_redis_connection('sms_code')
        # 取出发送中的标记, 如果存在就说明没有过1分钟
        sending_flag = redis_conn.get("sending_flag_%s" % mobile)
        if sending_flag:
            return http.JsonResponse({'code': RET.REQERR, 'errmsg': '频繁发送'})

        # redis_conn.setex(mobile,constants.REDIS_SMS_CODE_EXPIRES,sms_code)
        # 保存一个 发送倒计时中的标记
        # redis_conn.setex("sending_flag_%s"%mobile,constants.REDIS_SMS_SENDING_FLAG_EXPRIES,True)

        # a. 生成一个pipeline
        pipeline = redis_conn.pipeline()
        # b. 给管道添加指令
        pipeline.setex(mobile,constants.REDIS_SMS_CODE_EXPIRES,sms_code)
        pipeline.setex("sending_flag_%s"%mobile,constants.REDIS_SMS_SENDING_FLAG_EXPRIES,'True')
        # c. 执行管道
        pipeline.execute()

        # 6. 发送短信
        # import time
        # time.sleep(5)
        # ccp = CCP()
        # 注意： 测试的短信模板编号为1
        # 【云通讯】您使用的是云通讯短信模板，您的验证码是{1}，请于{2}分钟内正确输入
        # {1}: 666999 {2}:5
        # ccp.send_template_sms(mobile, [sms_code, constants.REDIS_SMS_CODE_EXPIRES/60], 1)
        # 不发短信, 直接打印短信验证码
        # send_sms.delay(mobile, sms_code, constants.REDIS_SMS_CODE_EXPIRES/60)
        print('sms_code:%s'%sms_code)
        # 8. 返回结果
        return http.JsonResponse({'code':RET.OK,'errmsg':'发送成功'})